/* global  expect, describe, it, apiTest */

const Admin = require('./fn')

describe('管理员 - 列表', function() {
  it('列表 - 正常', function() {
    return Admin.checkList()
  })

  it('列表 - 搜索| 管理员名称: test', function() {
    return Admin.checkList({ username: 'test' }, function(v) {
      expect(v.username).to.match(/test/i)
    })
  })

  it('列表 - 过滤| 状态: 正常', function() {
    return Admin.checkList({ status: 0 }, function(v) {
      expect(v.status).to.equal(0)
    })
  })

  it('列表 - 搜索+过滤| 管理员名称: test', function() {
    return Admin.checkList({ username: 'test', status: 0 }, function(v) {
      expect(v.username).to.match(/test/i)
      expect(v.status).to.equal(0)
    })
  })

  it('列表 - 过滤| 状态: 冻结', function() {
    return Admin.checkList({ status: -1 }, function(v) {
      expect(v.status).to.equal(-1)
    })
  })
  it('列表 - 2页5条', function() {
    return Admin.checkList({ page: 2, limit: 5 })
  })
  it('列表 - 1页20条', function() {
    return Admin.checkList({ page: 1, limit: 20 })
  })
  it('列表 - 99页10条', function() {
    return Admin.checkList({ page: 99, limit: 10 })
  })
})
describe('管理员 - 集成测试', function() {
  it('新增>修改>查询>删除', function() {
    // 增
    var post = Admin.randOne()
    return Admin.addOne(post, function(data) {
      // 改
      return Admin.editOne(data._id, Admin.randOne(), (data, post) => {
        // 删
        return Admin.removeOne([data._id])
      })
    })
  })

  it('新增>登录>修改>登录>查询>删除', function() {
    // 增
    var post = Admin.randOne()
    return Admin.addOne(post, function(data) {
      // 登录
      return Admin.login({ username: data.username, password: post.password }, () => {
        // 改
        return Admin.editOne(data._id, Admin.randOne(), (data, post) => {
          // 登录
          return Admin.login({ username: data.username, password: post.password }, () => {
            // 删
            return Admin.removeOne([data._id])
          })
        })
      })
    })
  })

  it('新增>更新空密码>登录验证老密码>删除', function() {
    // 增
    var post = Admin.randOne()
    return Admin.addOne(post, function(data) {
      // 改
      var emptyPw = Admin.randOne()
      emptyPw.password = ''
      return apiTest.post('/admin/update?_id=' + data._id, { password: '' }).then(function(res) {
      // return Admin.editOne(data._id, emptyPw, (data) => {
        // console.log(data, post)
        // 登录
        return Admin.login({ username: data.username, password: post.password }, () => {
          // 删
          return Admin.removeOne([data._id])
        })
      })
    })
  })

  it('新增冻结状态 > 删除', function() {
    var post = Admin.randOne()
    post.status = -1
    post.mail = post.mobile + '@qq.com'
    return Admin.addOne(post, function(data) {
      expect(data.status).to.equal(post.status)
      expect(data.mail).to.equal(post.mail)
      return Admin.removeOne([data._id])
    })
  })
})

describe('管理员 - 异常用例', function() {
  it('详情 - 异常 无参数', function() {
    return apiTest.get('/admin/findOne', {})
      .then(function(res) {
        var error = apiTest.apiErr(res, 31000)
        expect(error.param).to.equal('_id')
      })
  })

  it('详情 - 异常 数据不存在', function() {
    return apiTest.get('/admin/findOne', { _id: '500000000000000000000000' })
      .then(function(res) {
        apiTest.apiErr(res, 32000)
      })
  })

  it('添加 - 异常| 必填项: 用户名', function() {
    var post = Admin.randOne()
    delete post.username
    return apiTest.post('/admin/create', post).then(function(res) {
      var error = apiTest.apiErr(res, 31000)
      expect(error.param).to.equal('username')
    })
  })

  it('添加 - 异常| 必填项: 手机号', function() {
    var post = Admin.randOne()
    delete post.mobile
    return apiTest.post('/admin/create', post).then(function(res) {
      var error = apiTest.apiErr(res, 31000)
      expect(error.param).to.equal('mobile')
    })
  })

  it('添加 - 异常| 必填项: 密码', function() {
    return apiTest.post('/admin/create', { username: 'autoTest', mobile: '13812341234' }).then(function(res) {
      var error = apiTest.apiErr(res, 31000)
      expect(error.param).to.equal('password')
    })
  })

  it('添加 - 异常| 必填项: 角色', function() {
    var post = Admin.randOne()
    delete post.role
    return apiTest.post('/admin/create', post).then(function(res) {
      var error = apiTest.apiErr(res, 31000)
      expect(error.param).to.equal('role')
    })
  })

  it('添加 - 异常| 用户名唯一测试', function() {
    var post = Admin.randOne()
    post.username = 'admin'
    return apiTest.post('/admin/create', post).then(function(res) {
      var error = apiTest.apiErr(res, 31001)
      expect(error.param).to.equal('username')
    })
  })

  it('添加 - 异常| 手机号格式错误', function() {
    var post = Admin.randOne()
    post.mobile = '138123412'
    return apiTest.post('/admin/create', post).then(function(res) {
      // console.log(res.data)
      var error = apiTest.apiErr(res, 31001)
      expect(error.param).to.equal('mobile')
    })
  })

  it('添加 - 异常| 密码位数不足', function() {
    var post = Admin.randOne()
    post.password = '123'
    return apiTest.post('/admin/create', post).then(function(res) {
      var error = apiTest.apiErr(res, 31001)
      expect(error.param).to.equal('password')
    })
  })

  it('编辑 - 异常| 手机格式错误', function() {
    var post = Admin.randOne()
    post.mobile = '13123123'
    post._id = '5a93ad8ee23cfe9414a7c75b'
    return apiTest.post('/admin/update?_id=5a7bb5b6db53c21240d4a895', post).then(function(res) {
      // console.log(res.data)
      var error = apiTest.apiErr(res, 31001)
      expect(error.param).to.equal('mobile', error.message)
    })
  })

  it('编辑 - 异常| 密码格式错误', function() {
    var post = Admin.randOne()
    post._id = '5a93ad8ee23cfe9414a7c75b'
    post.password = '123'
    return apiTest.post('/admin/update?_id=5a7bb5b6db53c21240d4a895', post).then(function(res) {
      var error = apiTest.apiErr(res, 31001)
      expect(error.param).to.equal('password', error.message)
    })
  })

  it('删除 - 异常| 不存在', function() {
    return apiTest.post('/admin/remove', { _id: '500000000000000000000000' }).then(function(res) {
      apiTest.apiErr(res, 32000)
    })
  })
})
